#include "Poligon.h"
#include <math.h>
Punct::Punct()
  {
    (*this).x=0;
    (*this).y=0;
    (*this).nume='O';
  }
Punct::Punct(char m,int a,int b)
  {
    (*this).x=a;
    (*this).y=b;
    (*this).nume=m;
  }
int Punct::getX()
  { int m;
    m=(*this).x;
    return m;
  }
int Punct::getY()
  { int m;
    m=(*this).y;
    return m;
  }
char Punct::getNume()
  {
    char m;
    m=(*this).nume;
    return m;
  }
void Punct::setX(int l)
  {
    (*this).x=l;
  }
void Punct::setY(int n)
  {
    (*this).y=n;
  }
void Punct::setNume(char q)
  {
    (*this).nume=q;
  }
ostream& operator<<(ostream& cout,const Punct X)
  {
     std::cout<<X.nume<<"("<<X.x<<","<<X.y<<")"<<endl;
     return cout;
  }
bool Punct::operator ==(Punct b)
	{	
		if ((*this).x==b.getX() && (*this).y==b.getY())
			return true;
			else
				return false;
	}
Poligon::Poligon(int n)
	{
	(*this).setNrPct(n);
	for(int i=0;i<n;i++)
		{
		char d;
		int x,y;
		std::cout<<"\nSe va citi punctul numarul "<<i<<".\n";
		std::cout<<"Introduceti numele : ";std::cin>>d;
		std::cout<<"Introduceti X : "; std::cin>>x;
		std::cout<<"Introduceti Y : "; std::cin>>y;
		(*this).Pct[i].setNume(d);
		(*this).Pct[i].setX(x);
		(*this).Pct[i].setY(y);
		}
	}
void Poligon::setNrPct(int m)
	{
	(*this).nrpct=m;	
	}
int Poligon::getNrPct()
	{
	return (*this).nrpct;	
	}
bool Poligon::isPoligon()
	{
	int l;
	l=(*this).getNrPct();
	l--;
	if((*this).Pct[0]==(*this).Pct[l])
		return true;
		else
			return false;	
	}
bool Poligon::isTriunghi()
	{
  if( (*this).isPoligon()==true && (*this).getNrPct()==4)
		return true;
		else
		return false;
	}
float Poligon::distanta(Punct A,Punct B)
	{
		int x1,x2,y1,y2,m1,m2;
		float m3;
		x1=A.getX();
		x2=B.getX();
		y1=A.getY();
		y2=B.getY();			
		if(x1<0)
			x1=(-1)*x1;
		if(x2<0)
			x2=(-1)*x2;
		if(y1<0)
			y1=(-1)*y1;
		if(y2<0)
			y2=(-1)*y2;
		m1=pow(x2-x1,2);
		m2=pow(y2-y1,2);
		m3=m1+m2;
		m3=sqrt(m3);				
		return m3;
	}
bool Poligon::isDreptunghi()
	{	
	bool ok=0;
	float lung[6];
	lung[0]=distanta((*this).Pct[0],((*this).Pct[1]));
	lung[1]=distanta((*this).Pct[2],((*this).Pct[3]));
	lung[2]=distanta((*this).Pct[0],((*this).Pct[3]));
	lung[3]=distanta((*this).Pct[1],((*this).Pct[2]));
	lung[4]=distanta((*this).Pct[0],((*this).Pct[2]));
	lung[5]=distanta((*this).Pct[3],((*this).Pct[1]));
	if(lung[0]==lung[1] && lung[2]==lung[3] && lung[4]==lung[5])
		ok=1;
	if ((*this).isPoligon()==true && ok==1)
		return true;
		else
			return false;
}
bool Poligon::isPatrat()
	{		
	int ok=0;
	float lung[6];
	lung[0]=distanta((*this).Pct[0],((*this).Pct[1]));
	lung[1]=distanta((*this).Pct[3],((*this).Pct[2]));
	lung[2]=distanta((*this).Pct[0],((*this).Pct[3]));
	lung[3]=distanta((*this).Pct[1],((*this).Pct[2]));
	lung[4]=distanta((*this).Pct[0],((*this).Pct[2]));
	lung[5]=distanta((*this).Pct[1],((*this).Pct[3]));
	if(lung[0]==lung[1] && lung[2]==lung[3] && lung[0]==lung[3] && lung[4]==lung[5])
		ok=1;
	if ((*this).isPoligon()==true && ok==1)
		return true;
		else
			return false;
	}
bool Poligon::isRomb()
	{	
	bool ok=0;
	float lung[6];
	lung[0]=distanta((*this).Pct[0],((*this).Pct[1]));
	lung[1]=distanta((*this).Pct[2],((*this).Pct[3]));
	lung[2]=distanta((*this).Pct[0],((*this).Pct[3]));
	lung[3]=distanta((*this).Pct[1],((*this).Pct[2]));
	lung[4]=distanta((*this).Pct[0],((*this).Pct[2]));
	lung[5]=distanta((*this).Pct[3],((*this).Pct[1]));
	if(lung[0]==lung[1] && lung[2]==lung[3] && lung[4]!=lung[5])
		ok=1;
	if ((*this).isPoligon()==true && ok==1)
		return true;
		else
			return false;
}
Punct Poligon::getMiddle(Punct A,Punct B)
	{	
	int x1,x2,y1,y2,t1,t2;
	char s='M';
	x1=A.getX();
	x2=B.getX();
	y1=A.getY();
	y2=B.getY();
	if(x1<0)
			x1=(-1)*x1;
	if(x2<0)
		x2=(-1)*x2;
	if(y1<0)
		y1=(-1)*y1;
	if(y2<0)
		y2=(-1)*y2;
	t1=(x1-x2)/2;
	t2=(y1-y2)/2;
	if(t1<0)
		t1=(-1)*t1;
	if(t2<0)
		t2=(-1)*t2;
	Punct L=Punct(s,t1,t2);
	return L;			
	}
bool Poligon::isParalelogram()
	{	
	bool ok=0;
	float lung[6];
	lung[0]=distanta((*this).Pct[0],((*this).Pct[1]));
	lung[1]=distanta((*this).Pct[2],((*this).Pct[3]));
	lung[2]=distanta((*this).Pct[0],((*this).Pct[3]));
	lung[3]=distanta((*this).Pct[1],((*this).Pct[2]));
	lung[4]=distanta((*this).Pct[0],((*this).Pct[2]));
	lung[5]=distanta((*this).Pct[3],((*this).Pct[1]));
	if(lung[0]==lung[1] && lung[2]==lung[3] && lung[4]!=lung[5])
		ok=1;
	if ((*this).isPoligon()==true && ok==1)
		return true;
		else
			return false;
}
bool Poligon::isInclus(Punct A)
	{
	int x,y,xmin=99,ymin=99,xmax=99,ymax=99;
	xmax=(-1)*xmax;
	ymax=(-1)*ymax;
	x=A.getX();
	y=A.getY();
	for(int i=0;i<(*this).getNrPct();i++)
		{
		if((*this).Pct[i].getX()>xmax)
			xmax=(*this).Pct[i].getX();
		if((*this).Pct[i].getX()<xmin)
			xmin=(*this).Pct[i].getX();
		if((*this).Pct[i].getY()>ymax)
			ymax=(*this).Pct[i].getY();
		if((*this).Pct[i].getY()<ymin)
			ymin=(*this).Pct[i].getY();
		}
	if((x>=xmin && x<=xmax) && (y>=ymin && y<=ymax))
		return true;
		else
		return false;
	}
bool Poligon::isConcav()
	{
	int stop=0;
	for(int i=0;i<(*this).getNrPct()&&stop==0;i++)
		for(int j=0;j<(*this).getNrPct()&&stop==0;j++)
			{
			if(i!=j)
				{
				Punct M;
				M=(*this).getMiddle((*this).Pct[i],(*this).Pct[j]);
				if((*this).isInclus(M)==0)
					stop=1;
				}	
			}
	return stop;
	}
